const basicAuth = require('basic-auth') //识别接口携带的HttpBasicAuth
const jwt = require('jsonwebtoken')
class Auth {
    constructor() {
    }
    get m() {
        return async (ctx, next) => {
            //token 检测=>合法放行,不合法拦截
            //token 开发者 传递令牌
            //token 可以放body/header 前后端约定放置地方
            //HTTP 规定 身份验证机制 HttpBasicAuth
            const userToken = basicAuth(ctx.req) //里面有base64的解密
            //ctx.req 获取的是node.js原生request对象
            //ctx.request 获取的是koa原生对node.js=>request进行封装后的对象对象
            let errMsg = 'token不合法'
            if (!userToken || !userToken.name) {
                throw new global.errs.Forbbiden()
            }
            try {
                var decode = jwt.verify(userToken.name, global.config.security.secretKey)
            } catch (error) {
                //token不合法
                //token过期
                if (error.name == 'TokenExpiredError') {
                    errMsg = 'token已过期'
                }
                throw new global.errs.Forbbiden(errMsg)
            }
            //uid,scope 需要另外传递的东西,每个接口都放上去/保存任意数据
            ctx.auth = {
                uid: decode.uid,
                scope: decode.scope
            }
            await next() //没有错误继续执行下一个中间件
        }
    }
}

module.exports = {
    Auth
}